package study_2;

/**
 * 该例子不是原子性
 * 假设线程T1通过执行updateHostInfo方法来更新主机信息（HostInfo），线程T2则通过执行connectToHost方法来读取主机信息，
 * 并据此与相应的主机建立网络连接。那么，updateHostInfo方法中的操作（更新主机IP地址和端口号）必须是一个原子操作，即这个操作必须是“不可分割”的
 * 否则，可能出现这样的情形：假设hostinfo的初始值表示的IP地址未“192.168.1.101”，端口号为8081的主机，T1执行updateHostInfo方法试图将hostinfo更新为IP地址未“192.168.100”、端口号为8080的主机的时候，
 * T2可能刚好执行connectToHost方法，那么此时由于T1可能刚刚执行完语句1而未开始语句2，因此T2可能读取到Ip地址未"192.168.1.100"而端口号却仍然未8081的主机信息。
 */
public class Thread2_2 {
    private HostInfo hostInfo;

    //因为该操作不具有原子性，导致connectToHost会出错
    public void updateHostInfo(String ip, int port){
        //以下操作不是原子操作
        hostInfo.setIp(ip);
        hostInfo.setPort(port);
    }

    public void connectToHost(){
        String ip = hostInfo.getIp();
        int port = hostInfo.getPort();
        connectToHost(ip, port);
    }

    private void connectToHost(String ip, int port){
        // ...
    }


    public static class HostInfo{
        private String ip;
        private int port;

        public String getIp() {
            return ip;
        }

        public void setIp(String ip) {
            this.ip = ip;
        }

        public int getPort() {
            return port;
        }

        public void setPort(int port) {
            this.port = port;
        }
        //...
    }
}
